/* Arquivo fonte retirado do projeto SIGA-RENAPI sob Licença Pública Geral GNU,
 * adapatado para satisfazer as necessidades arquiteturais desta aplicação.
 */
package br.edu.ifrn.utils;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

import br.edu.ifrn.generic.GenericEntidade;


public class ValidadorCampoUnico {

	/**
	 * Valida um campo passado como parametro, através de uma NamedQuery, verificando se este é único, se não for lança uma exceção
	 * 
	 * @param entityManager EntityManager que executará a query
	 * @param namedQuery nome da NamedQuery que deve ser executada para a validação
	 * @param parametro nome do parametro que está na namedQuery a ser substituido pelo aValidar
	 * @param aValidar valor a ser validado
	 * @param mensagemErro a chave da mensagem no arquivo propreties que deve ser exibido caso o campo não
	 * 		seja válido
	 * @param erros Lista de erros da entidade
	 * @param entidade Entidade a ser validada
	 * 
	 */
	public static void validarByNamedQuery(EntityManager entityManager, String namedQuery, String parametro,
			Object aValidar, String mensagemErro, List<String> erros, GenericEntidade entidade){
		try {
			Query query = entityManager.createNamedQuery(namedQuery);
			Object object = query.setParameter(parametro, aValidar)
					.getSingleResult();
			if (object != null && (entidade.getId() == null || !entidade.getId().equals(((GenericEntidade)object).getId()))) {
				erros.add(mensagemErro);
			}
		} catch (NoResultException e) {
			return;
		} catch (NonUniqueResultException e) {
			erros.add(mensagemErro);
		}
	}
	
//	/**
//	 * Valida dois campos passados como parametro, através de uma NamedQuery, verificando se este é único, se não for lança uma exceção
//	 * 
//	 * @param entityManager EntityManager que executará a query
//	 * @param namedQuery nome da NamedQuery que deve ser executada para a validação
//	 * @param parametro1 nome do primeiro parametro que está na namedQuery a ser substituido pelo aValidar1
//	 * @param aValidar1  primeiro valor a ser validado
//	 * @param parametro2 nome do segundo parametro que está na namedQuery a ser substituido pelo aValidar2
//	 * @param aValidar2  segundo valor a ser validado
//	 * @param mensagemErro a chave da mensagem no arquivo propreties que deve ser exibido caso o campo não
//	 * 		seja válido
//	 * @throws NegocioException se o valor não for único
//	 */
//	public static void validarByNamedQuery(EntityManager entityManager, String namedQuery, String parametro1,
//			Object aValidar1, String parametro2, Object aValidar2, String mensagemErro) throws NegocioException {
//		try {
//			Query query = entityManager.createNamedQuery(namedQuery);
//			query.setParameter(parametro1, aValidar1);
//			query.setParameter(parametro2, aValidar2);
//			Object object = query.getSingleResult();
//			if (object != null) {
//				throw new NegocioException(mensagemErro);
//			}
//		} catch (NoResultException e) {
//			return;
//		} catch (NonUniqueResultException e) {
//			throw new NegocioException(mensagemErro);
//		}
//	}
//
//	/**
//	 * Valida um campo passado como parametro, através de uma EJBQL, verificando se este é único, se não for lança uma exceção
//	 * 
//	 * @param entityManager EntityManager que executará a query
//	 * @param ejbql EJBQL que deve ser executada para a validação
//	 * @param parametro nome do parametro que está na EJBQL a ser substituido pelo aValidar
//	 * @param aValidar valor a ser validado
//	 * @param mensagemErro a chave da mensagem no arquivo propreties que deve ser exibido caso o campo não
//	 * 		seja válido
//	 * @throws NegocioException se o valor não for único
//	 */
//	public static void validarByQuery(EntityManager entityManager, String ejbql, String parametro,
//			Object aValidar, String mensagemErro) throws NegocioException {
//		try {
//			Query query = entityManager.createQuery(ejbql);
//			Object object = query.setParameter(parametro, aValidar)
//					.getSingleResult();
//			if (object != null) {
//				throw new NegocioException(mensagemErro);
//			}
//		} catch (NoResultException e) {
//			return;
//		} catch (NonUniqueResultException e) {
//			throw new NegocioException(mensagemErro);
//		}
//	}
//
//	public static void validarByQuery(EntityManager entityManager,
//			String ejbql, String parametro, Object aValidar, String parametro2,
//			Object aValidar2, String mensagemErro) throws NegocioException {
//		try {
//			Query query = entityManager.createQuery(ejbql);
//			query.setParameter(parametro, aValidar);
//			query.setParameter(parametro2, aValidar2);
//			Object object = query.getSingleResult();
//			if (object != null) {
//				throw new NegocioException(mensagemErro);
//			}
//		} catch (NoResultException e) {
//			return;
//		} catch (NonUniqueResultException e) {
//			throw new NegocioException(mensagemErro);
//		}
//		
//	}

}
